home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 22
/
Aminet 22 (1997)(GTI - Schatztruhe)[!][Dec 1997].iso
/
Aminet
/
util
/
cdity
/
VesaDPMSPro.lha
/
VesaDPMSPro
/
custom.asm
next >
Wrap
Assembly Source File
|
1997-09-11
|
2KB
|
82 lines
; Handoptimized Custom CxObj routine, fast and efficient
; Total rewrite of C-Compiler output (which was partial crap)
;
; This function supports pipelining of the latest MC680x0 processors,
; when possible (that means mixing opcodes, that use different
; functional units of the processor, to parallelize some processes).
; That's also known as "scaling".
;
; According to the RKM, this function also makes no assumptions about
; registers, and restores all registers used by itself to the values
; they contained at entry. However, this uses up 20 bytes of stack.
;
; Only two system functions are called: CxMsgData() and Signal()
XREF _SysBase
XREF _CxBase
XREF _listen
XREF _lastsig
XREF _prefs
XDEF _cx_custom_func
_cx_custom_func
movem.l d0/d1/a0/a1/a6,-(sp)
move.l 24(sp),a0 ;get cxm
move.l _CxBase,a6
jsr -$90(a6) ;CxMsgData(cxm)
move.l d0,a0 ;InputEvent
moveq.l #1,d1 ;1
sub.l d0,d0 ;erase register (faster on '060)
move.b 4(a0),d0 ;InputEvent->ie_Class
asl.l d0,d1 ;<<
and.l _listen,d1 ;(1 << InputEvent->ie_Class) & listen
beq.b ciao ;if not, quit
move.l _lastsig,d1 ;lastsig
move.l 14(a0),d0 ;InputEvent->ie_TimeStamp.tv_secs
cmp.l d0,d1 ;lastsig - InputEvent->ie_TimeStamp.tv_secs
bhi.b higher ;if higher
sub.l d1,d0 ;else equal/lower, calculate difference
bra.b delta ;skip higher
higher
sub.l d0,d1 ;calculate difference
move.l d1,d0 ;use appropriate register
delta
cmp.l #1,d0 ;delta - 4
bls.b ciao ;if lower or same, quit
tst.l _prefs+28 ;prefs.dpmslevel
beq.b signal ;if null (== DPMS_ON), signal every event
moveq.l #1,d1 ;else 1
sub.l d0,d0 ;erase register
move.b 4(a0),d0 ;InputEvent->ie_Class
asl.l d0,d1 ;<<
and.l _prefs+24,d1 ;(1 << InputEvent->ie_Class) & prefs.wakeup
beq.b ciao ;if no wakeup event, quit
signal
move.l 14(a0),_lastsig ;lastsig = InputEvent->ie_TimeStamp.tv_secs
moveq.l #1,d0 ;1
move.l _prefs+32,d1 ;prefs.signal
asl.l d1,d0 ;<<
move.l _prefs+4,a1 ;prefs->cxport
move.l 16(a1),a1 ;MsgPort->mp_SigTask
move.l _SysBase,a6
jsr -$144(a6) ;Signal(prefs.cxport->mp_SigTask, 1 << prefs.signal)
ciao
movem.l (sp)+,d0/d1/a0/a1/a6
rts
END